home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February (DVD) / PCWorld_2008-02_DVD.iso / v cisle / PHP / PHP.exe / xampp-win32-1.6.5-installer.exe / phpMyAdmin / libraries / dbi / mysqli.dbi.lib.php < prev   
Encoding:
PHP Script  |  2007-12-20  |  21.9 KB  |  706 lines

  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4.  * Interface to the improved MySQL extension (MySQLi)
  5.  *
  6.  * @version $Id: mysqli.dbi.lib.php 10356 2007-05-08 20:39:33Z cybot_tm $
  7.  */
  8.  
  9. // MySQL client API
  10. if (!defined('PMA_MYSQL_CLIENT_API')) {
  11.     $client_api = explode('.', mysqli_get_client_info());
  12.     define('PMA_MYSQL_CLIENT_API', (int)sprintf('%d%02d%02d', $client_api[0], $client_api[1], intval($client_api[2])));
  13.     unset($client_api);
  14. }
  15.  
  16. // Constants from mysql_com.h of MySQL 4.1.3
  17. /**
  18.  * @deprecated
  19. define('NOT_NULL_FLAG',         MYSQLI_NOT_NULL_FLAG);
  20. define('PRI_KEY_FLAG',          MYSQLI_PRI_KEY_FLAG);
  21. define('UNIQUE_KEY_FLAG',       MYSQLI_UNIQUE_KEY_FLAG);
  22. define('MULTIPLE_KEY_FLAG',     MYSQLI_MULTIPLE_KEY_FLAG);
  23. define('BLOB_FLAG',             MYSQLI_BLOB_FLAG);
  24. define('UNSIGNED_FLAG',         MYSQLI_UNSIGNED_FLAG);
  25. define('ZEROFILL_FLAG',         MYSQLI_ZEROFILL_FLAG);
  26. define('BINARY_FLAG',           MYSQLI_BINARY_FLAG);
  27. define('ENUM_FLAG',             MYSQLI_TYPE_ENUM);
  28. define('AUTO_INCREMENT_FLAG',   MYSQLI_AUTO_INCREMENT_FLAG);
  29. define('TIMESTAMP_FLAG',        MYSQLI_TIMESTAMP_FLAG);
  30. define('SET_FLAG',              MYSQLI_SET_FLAG);
  31. define('NUM_FLAG',              MYSQLI_NUM_FLAG);
  32. define('PART_KEY_FLAG',         MYSQLI_PART_KEY_FLAG);
  33. define('UNIQUE_FLAG',           MYSQLI_UNIQUE_FLAG);
  34.  */
  35.  
  36. /**
  37.  * some older mysql client libs are missing this constants ...
  38.  */
  39. if (! defined('MYSQLI_BINARY_FLAG')) {
  40.    define('MYSQLI_BINARY_FLAG', 128);
  41. }
  42.  
  43. /**
  44.  * @see http://bugs.php.net/36007
  45.  */
  46. if (! defined('MYSQLI_TYPE_NEWDECIMAL')) {
  47.     define('MYSQLI_TYPE_NEWDECIMAL', 246);
  48. }
  49. if (! defined('MYSQLI_TYPE_BIT')) {
  50.     define('MYSQLI_TYPE_BIT', 16);
  51. }
  52.  
  53. /**
  54.  * connects to the database server
  55.  *
  56.  * @uses    $GLOBALS['cfg']['Server']
  57.  * @uses    PMA_auth_fails()
  58.  * @uses    PMA_DBI_postConnect()
  59.  * @uses    MYSQLI_CLIENT_COMPRESS
  60.  * @uses    MYSQLI_OPT_LOCAL_INFILE
  61.  * @uses    strtolower()
  62.  * @uses    mysqli_init()
  63.  * @uses    mysqli_options()
  64.  * @uses    mysqli_real_connect()
  65.  * @uses    defined()
  66.  * @param   string  $user           mysql user name
  67.  * @param   string  $password       mysql user password
  68.  * @param   boolean $is_controluser
  69.  * @return  mixed   false on error or a mysqli object on success
  70.  */
  71. function PMA_DBI_connect($user, $password, $is_controluser = false)
  72. {
  73.     $server_port   = (empty($GLOBALS['cfg']['Server']['port']))
  74.                    ? false
  75.                    : (int) $GLOBALS['cfg']['Server']['port'];
  76.  
  77.     if (strtolower($GLOBALS['cfg']['Server']['connect_type']) == 'tcp') {
  78.         $GLOBALS['cfg']['Server']['socket'] = '';
  79.     }
  80.  
  81.     // NULL enables connection to the default socket
  82.     $server_socket = (empty($GLOBALS['cfg']['Server']['socket']))
  83.                    ? null
  84.                    : $GLOBALS['cfg']['Server']['socket'];
  85.  
  86.     $link = mysqli_init();
  87.  
  88.     mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
  89.  
  90.     $client_flags = 0;
  91.  
  92.     /* Optionally compress connection */
  93.     if ($GLOBALS['cfg']['Server']['compress'] && defined('MYSQLI_CLIENT_COMPRESS')) {
  94.         $client_flags |= MYSQLI_CLIENT_COMPRESS;
  95.     }
  96.  
  97.     /* Optionally enable SSL */
  98.     if ($GLOBALS['cfg']['Server']['ssl'] && defined('MYSQLI_CLIENT_SSL')) {
  99.         $client_flags |= MYSQLI_CLIENT_SSL;
  100.     }
  101.  
  102.     $return_value = @mysqli_real_connect($link, $GLOBALS['cfg']['Server']['host'], $user, $password, false, $server_port, $server_socket, $client_flags);
  103.  
  104.     // Retry with empty password if we're allowed to
  105.     if ($return_value == false && isset($cfg['Server']['nopassword']) && $cfg['Server']['nopassword'] && !$is_controluser) {
  106.         $return_value = @mysqli_real_connect($link, $GLOBALS['cfg']['Server']['host'], $user, '', false, $server_port, $server_socket, $client_flags);
  107.     }
  108.  
  109.     if ($return_value == false) {
  110.         if ($is_controluser) {
  111.             if (! defined('PMA_DBI_CONNECT_FAILED_CONTROLUSER')) {
  112.                 define('PMA_DBI_CONNECT_FAILED_CONTROLUSER', true);
  113.             }
  114.             return false;
  115.         }
  116.         PMA_auth_fails();
  117.     } // end if
  118.  
  119.     PMA_DBI_postConnect($link, $is_controluser);
  120.  
  121.     return $link;
  122. }
  123.  
  124. /**
  125.  * selects given database
  126.  *
  127.  * @uses    $GLOBALS['userlink']
  128.  * @uses    PMA_MYSQL_INT_VERSION
  129.  * @uses    PMA_convert_charset()
  130.  * @uses    mysqli_select_db()
  131.  * @param   string          $dbname database name to select
  132.  * @param   object mysqli   $link   the mysli object
  133.  * @return  boolean         treu or false
  134.  */
  135. function PMA_DBI_select_db($dbname, $link = null)
  136. {
  137.     if (empty($link)) {
  138.         if (isset($GLOBALS['userlink'])) {
  139.             $link = $GLOBALS['userlink'];
  140.         } else {
  141.             return false;
  142.         }
  143.     }
  144.     if (PMA_MYSQL_INT_VERSION < 40100) {
  145.         $dbname = PMA_convert_charset($dbname);
  146.     }
  147.     return mysqli_select_db($link, $dbname);
  148. }
  149.  
  150. /**
  151.  * runs a query and returns the result
  152.  *
  153.  * @uses    PMA_DBI_QUERY_STORE
  154.  * @uses    PMA_DBI_QUERY_UNBUFFERED
  155.  * @uses    PMA_MYSQL_INT_VERSION
  156.  * @uses    $GLOBALS['userlink']
  157.  * @uses    PMA_convert_charset()
  158.  * @uses    MYSQLI_STORE_RESULT
  159.  * @uses    MYSQLI_USE_RESULT
  160.  * @uses    mysqli_query()
  161.  * @uses    defined()
  162.  * @param   string          $query      query to execute
  163.  * @param   object mysqli   $link       mysqli object
  164.  * @param   integer         $options
  165.  * @return  mixed           true, false or result object
  166.  */
  167. function PMA_DBI_try_query($query, $link = null, $options = 0)
  168. {
  169.     if ($options == ($options | PMA_DBI_QUERY_STORE)) {
  170.         $method = MYSQLI_STORE_RESULT;
  171.     } elseif ($options == ($options | PMA_DBI_QUERY_UNBUFFERED)) {
  172.         $method = MYSQLI_USE_RESULT;
  173.     } else {
  174.         $method = 0;
  175.     }
  176.  
  177.     if (empty($link)) {
  178.         if (isset($GLOBALS['userlink'])) {
  179.             $link = $GLOBALS['userlink'];
  180.         } else {
  181.             return false;
  182.         }
  183.     }
  184.     if (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION < 40100) {
  185.         $query = PMA_convert_charset($query);
  186.     }
  187.     return mysqli_query($link, $query, $method);
  188.  
  189.     // From the PHP manual:
  190.     // "note: returns true on success or false on failure. For SELECT,
  191.     // SHOW, DESCRIBE or EXPLAIN, mysqli_query() will return a result object"
  192.     // so, do not use the return value to feed mysqli_num_rows() if it's
  193.     // a boolean
  194. }
  195.  
  196. /**
  197.  * returns $type array of rows from given $result
  198.  *
  199.  * The following function is meant for internal use only.
  200.  * Do not call it from outside this library!
  201.  *
  202.  * @uses    $GLOBALS['allow_recoding']
  203.  * @uses    $GLOBALS['cfg']['AllowAnywhereRecoding']
  204.  * @uses    PMA_MYSQL_INT_VERSION
  205.  * @uses    PMA_DBI_get_fields_meta()
  206.  * @uses    PMA_convert_display_charset()
  207.  * @uses    mysqli_fetch_array()
  208.  * @uses    mysqli_num_fields()
  209.  * @uses    stristr()
  210.  * @param   object mysqli result    $result
  211.  * @param   integer                 $type   ASSOC, BOTH, or NUMERIC array
  212.  * @return  array                   results
  213.  * @access  protected
  214.  */
  215. function PMA_mysqli_fetch_array($result, $type = false)
  216. {
  217.     if ($type != false) {
  218.         $data = @mysqli_fetch_array($result, $type);
  219.     } else {
  220.         $data = @mysqli_fetch_array($result);
  221.     }
  222.  
  223.     /* No data returned => do not touch it */
  224.     if (! $data) {
  225.         return $data;
  226.     }
  227.  
  228.     if (!defined('PMA_MYSQL_INT_VERSION') || PMA_MYSQL_INT_VERSION >= 40100
  229.       || !(isset($GLOBALS['cfg']['AllowAnywhereRecoding'])
  230.         && $GLOBALS['cfg']['AllowAnywhereRecoding']
  231.         && $GLOBALS['allow_recoding'])) {
  232.         /* No recoding -> return data as we got them */
  233.         return $data;
  234.     }
  235.  
  236.     $ret    = array();
  237.     $num    = mysqli_num_fields($result);
  238.     if ($num > 0) {
  239.         $fields = PMA_DBI_get_fields_meta($result);
  240.     }
  241.     // sometimes, mysqli_fetch_fields() does not return results
  242.     // (as seen in PHP 5.1.0-dev), so for now, return $data unchanged
  243.     if (!$fields) {
  244.         return $data;
  245.     }
  246.     $i = 0;
  247.     for ($i = 0; $i < $num; $i++) {
  248.         if (!isset($fields[$i]->type)) {
  249.             /* No meta information available -> we guess that it should be
  250.              * converted */
  251.             if (isset($data[$i])) {
  252.                 $ret[$i] = PMA_convert_display_charset($data[$i]);
  253.             }
  254.             if (isset($fields[$i]->name) && isset($data[$fields[$i]->name])) {
  255.                 $ret[PMA_convert_display_charset($fields[$i]->name)] =
  256.                     PMA_convert_display_charset($data[$fields[$i]->name]);
  257.             }
  258.         } else {
  259.             /* Meta information available -> check type of field and convert
  260.              * it according to the type */
  261.             if (stristr($fields[$i]->type, 'BLOB')
  262.               || stristr($fields[$i]->type, 'BINARY')) {
  263.                 if (isset($data[$i])) {
  264.                     $ret[$i] = $data[$i];
  265.                 }
  266.                 if (isset($data[$fields[$i]->name])) {
  267.                     $ret[PMA_convert_display_charset($fields[$i]->name)] =
  268.                         $data[$fields[$i]->name];
  269.                 }
  270.             } else {
  271.                 if (isset($data[$i])) {
  272.                     $ret[$i] = PMA_convert_display_charset($data[$i]);
  273.                 }
  274.                 if (isset($data[$fields[$i]->name])) {
  275.                     $ret[PMA_convert_display_charset($fields[$i]->name)] =
  276.                         PMA_convert_display_charset($data[$fields[$i]->name]);
  277.                 }
  278.             }
  279.         }
  280.     }
  281.     return $ret;
  282. }
  283.  
  284. /**
  285.  * returns array of rows with associative and numeric keys from $result
  286.  *
  287.  * @uses    PMA_mysqli_fetch_array()
  288.  * @uses    MYSQLI_BOTH
  289.  * @param   object mysqli result    $result
  290.  * @return  array                   result rows
  291.  */
  292. function PMA_DBI_fetch_array($result)
  293. {
  294.     return PMA_mysqli_fetch_array($result, MYSQLI_BOTH);
  295. }
  296.  
  297. /**
  298.  * returns array of rows with associative keys from $result
  299.  *
  300.  * @uses    PMA_mysqli_fetch_array()
  301.  * @uses    MYSQLI_ASSOC
  302.  * @param   object mysqli result    $result
  303.  * @return  array                   result rows
  304.  */
  305. function PMA_DBI_fetch_assoc($result)
  306. {
  307.     return PMA_mysqli_fetch_array($result, MYSQLI_ASSOC);
  308. }
  309.  
  310. /**
  311.  * returns array of rows with numeric keys from $result
  312.  *
  313.  * @uses    PMA_mysqli_fetch_array()
  314.  * @uses    MYSQLI_NUM
  315.  * @param   object mysqli result    $result
  316.  * @return  array                   result rows
  317.  */
  318. function PMA_DBI_fetch_row($result)
  319. {
  320.     return PMA_mysqli_fetch_array($result, MYSQLI_NUM);
  321. }
  322.  
  323. /**
  324.  * Frees the memory associated with the results
  325.  *
  326.  * @uses    mysqli_result
  327.  * @uses    func_get_args()
  328.  * @uses    is_object()
  329.  * @uses    is_a()
  330.  * @uses    mysqli_free_result()
  331.  * @param   result  $result,...     one or more mysql result resources
  332.  */
  333. function PMA_DBI_free_result()
  334. {
  335.     foreach (func_get_args() as $result) {
  336.         if (is_object($result)
  337.           && is_a($result, 'mysqli_result')) {
  338.             mysqli_free_result($result);
  339.         }
  340.     }
  341. }
  342.  
  343. /**
  344.  * Returns a string representing the type of connection used
  345.  * @uses    mysqli_get_host_info()
  346.  * @uses    $GLOBALS['userlink']    as default for $link
  347.  * @param   resource        $link   mysql link
  348.  * @return  string          type of connection used
  349.  */
  350. function PMA_DBI_get_host_info($link = null)
  351. {
  352.     if (null === $link) {
  353.         if (isset($GLOBALS['userlink'])) {
  354.             $link = $GLOBALS['userlink'];
  355.         } else {
  356.             return false;
  357.         }
  358.     }
  359.     return mysqli_get_host_info($link);
  360. }
  361.  
  362. /**
  363.  * Returns the version of the MySQL protocol used
  364.  * @uses    mysqli_get_proto_info()
  365.  * @uses    $GLOBALS['userlink']    as default for $link
  366.  * @param   resource        $link   mysql link
  367.  * @return  integer         version of the MySQL protocol used
  368.  */
  369. function PMA_DBI_get_proto_info($link = null)
  370. {
  371.     if (null === $link) {
  372.         if (isset($GLOBALS['userlink'])) {
  373.             $link = $GLOBALS['userlink'];
  374.         } else {
  375.             return false;
  376.         }
  377.     }
  378.     return mysqli_get_proto_info($link);
  379. }
  380.  
  381. /**
  382.  * returns a string that represents the client library version
  383.  * @uses    mysqli_get_client_info()
  384.  * @return  string          MySQL client library version
  385.  */
  386. function PMA_DBI_get_client_info()
  387. {
  388.     return mysqli_get_client_info();
  389. }
  390.  
  391. /**
  392.  * returns last error message or false if no errors occured
  393.  *
  394.  * @uses    PMA_MYSQL_INT_VERSION
  395.  * @uses    PMA_convert_display_charset()
  396.  * @uses    PMA_DBI_convert_message()
  397.  * @uses    $GLOBALS['errno']
  398.  * @uses    $GLOBALS['userlink']
  399.  * @uses    $GLOBALS['strServerNotResponding']
  400.  * @uses    $GLOBALS['strSocketProblem']
  401.  * @uses    mysqli_errno()
  402.  * @uses    mysqli_error()
  403.  * @uses    mysqli_connect_errno()
  404.  * @uses    mysqli_connect_error()
  405.  * @uses    defined()
  406.  * @param   resource        $link   mysql link
  407.  * @return  string|boolean  $error or false
  408.  */
  409. function PMA_DBI_getError($link = null)
  410. {
  411.     $GLOBALS['errno'] = 0;
  412.  
  413.     if (null === $link && isset($GLOBALS['userlink'])) {
  414.         $link =& $GLOBALS['userlink'];
  415.         // Do not stop now. We still can get the error code
  416.         // with mysqli_connect_errno()
  417. //    } else {
  418. //        return false;
  419.     }
  420.  
  421.     if (null !== $link) {
  422.         $error_number = mysqli_errno($link);
  423.         $error_message = mysqli_error($link);
  424.     } else {
  425.         $error_number = mysqli_connect_errno();
  426.         $error_message = mysqli_connect_error();
  427.     }
  428.     if (0 == $error_number) {
  429.         return false;
  430.     }
  431.  
  432.     // keep the error number for further check after the call to PMA_DBI_getError()
  433.     $GLOBALS['errno'] = $error_number;
  434.  
  435.     if (! empty($error_message)) {
  436.         $error_message = PMA_DBI_convert_message($error_message);
  437.     }
  438.  
  439.     if ($error_number == 2002) {
  440.         $error = '#' . ((string) $error_number) . ' - ' . $GLOBALS['strServerNotResponding'] . ' ' . $GLOBALS['strSocketProblem'];
  441.     } elseif (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION >= 40100) {
  442.         $error = '#' . ((string) $error_number) . ' - ' . $error_message;
  443.     } else {
  444.         $error = '#' . ((string) $error_number) . ' - ' . PMA_convert_display_charset($error_message);
  445.     }
  446.     return $error;
  447. }
  448.  
  449. /**
  450.  * closes given database $link or $GLOBALS['userlink']
  451.  *
  452.  * @uses    $GLOBALS['userlink']
  453.  * @uses    mysqli_close()
  454.  * @param   object mysqli   $link   the mysqli object
  455.  * @return  boolean         treu or false
  456.  */
  457. function PMA_DBI_close($link = null)
  458. {
  459.     if (empty($link)) {
  460.         if (isset($GLOBALS['userlink'])) {
  461.             $link = $GLOBALS['userlink'];
  462.         } else {
  463.             return false;
  464.         }
  465.     }
  466.     return @mysqli_close($link);
  467. }
  468.  
  469. /**
  470.  *
  471.  * @param   object mysqli result    $result
  472.  */
  473. function PMA_DBI_num_rows($result)
  474. {
  475.     // see the note for PMA_DBI_try_query();
  476.     if (!is_bool($result)) {
  477.         return @mysqli_num_rows($result);
  478.     } else {
  479.         return 0;
  480.     }
  481. }
  482.  
  483. /**
  484.  * returns last inserted auto_increment id for given $link or $GLOBALS['userlink']
  485.  *
  486.  * @uses    $GLOBALS['userlink']
  487.  * @uses    mysqli_insert_id()
  488.  * @param   object mysqli   $link   the mysqli object
  489.  * @return  string ineteger
  490.  */
  491. function PMA_DBI_insert_id($link = '')
  492. {
  493.     if (empty($link)) {
  494.         if (isset($GLOBALS['userlink'])) {
  495.             $link = $GLOBALS['userlink'];
  496.         } else {
  497.             return false;
  498.         }
  499.     }
  500.     return mysqli_insert_id($link);
  501. }
  502.  
  503. /**
  504.  * returns the number of rows affected by last query
  505.  *
  506.  * @uses    $GLOBALS['userlink']
  507.  * @uses    mysqli_affected_rows()
  508.  * @param   object mysqli   $link   the mysqli object
  509.  * @return  string integer
  510.  */
  511. function PMA_DBI_affected_rows($link = null)
  512. {
  513.     if (empty($link)) {
  514.         if (isset($GLOBALS['userlink'])) {
  515.             $link = $GLOBALS['userlink'];
  516.         } else {
  517.             return false;
  518.         }
  519.     }
  520.     return mysqli_affected_rows($link);
  521. }
  522.  
  523. /**
  524.  * returns metainfo for fields in $result
  525.  *
  526.  * @todo preserve orignal flags value
  527.  * @uses    PMA_DBI_field_flags()
  528.  * @uses    MYSQLI_TYPE_*
  529.  * @uses    MYSQLI_MULTIPLE_KEY_FLAG
  530.  * @uses    MYSQLI_PRI_KEY_FLAG
  531.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  532.  * @uses    MYSQLI_NOT_NULL_FLAG
  533.  * @uses    MYSQLI_UNSIGNED_FLAG
  534.  * @uses    MYSQLI_ZEROFILL_FLAG
  535.  * @uses    MYSQLI_NUM_FLAG
  536.  * @uses    MYSQLI_TYPE_BLOB
  537.  * @uses    MYSQLI_BLOB_FLAG
  538.  * @uses    defined()
  539.  * @uses    mysqli_fetch_fields()
  540.  * @uses    is_array()
  541.  * @param   object mysqli result    $result
  542.  * @return  array                   meta info for fields in $result
  543.  */
  544. function PMA_DBI_get_fields_meta($result)
  545. {
  546.     // Build an associative array for a type look up
  547.     $typeAr = array();
  548.     $typeAr[MYSQLI_TYPE_DECIMAL]     = 'real';
  549.     $typeAr[MYSQLI_TYPE_NEWDECIMAL]  = 'real';
  550.     $typeAr[MYSQLI_TYPE_BIT]         = 'int';
  551.     $typeAr[MYSQLI_TYPE_TINY]        = 'int';
  552.     $typeAr[MYSQLI_TYPE_SHORT]       = 'int';
  553.     $typeAr[MYSQLI_TYPE_LONG]        = 'int';
  554.     $typeAr[MYSQLI_TYPE_FLOAT]       = 'real';
  555.     $typeAr[MYSQLI_TYPE_DOUBLE]      = 'real';
  556.     $typeAr[MYSQLI_TYPE_NULL]        = 'null';
  557.     $typeAr[MYSQLI_TYPE_TIMESTAMP]   = 'timestamp';
  558.     $typeAr[MYSQLI_TYPE_LONGLONG]    = 'int';
  559.     $typeAr[MYSQLI_TYPE_INT24]       = 'int';
  560.     $typeAr[MYSQLI_TYPE_DATE]        = 'date';
  561.     $typeAr[MYSQLI_TYPE_TIME]        = 'time';
  562.     $typeAr[MYSQLI_TYPE_DATETIME]    = 'datetime';
  563.     $typeAr[MYSQLI_TYPE_YEAR]        = 'year';
  564.     $typeAr[MYSQLI_TYPE_NEWDATE]     = 'date';
  565.     $typeAr[MYSQLI_TYPE_ENUM]        = 'unknown';
  566.     $typeAr[MYSQLI_TYPE_SET]         = 'unknown';
  567.     $typeAr[MYSQLI_TYPE_TINY_BLOB]   = 'blob';
  568.     $typeAr[MYSQLI_TYPE_MEDIUM_BLOB] = 'blob';
  569.     $typeAr[MYSQLI_TYPE_LONG_BLOB]   = 'blob';
  570.     $typeAr[MYSQLI_TYPE_BLOB]        = 'blob';
  571.     $typeAr[MYSQLI_TYPE_VAR_STRING]  = 'string';
  572.     $typeAr[MYSQLI_TYPE_STRING]      = 'string';
  573.     // MySQL returns MYSQLI_TYPE_STRING for CHAR
  574.     // and MYSQLI_TYPE_CHAR === MYSQLI_TYPE_TINY
  575.     // so this would override TINYINT and mark all TINYINT as string
  576.     // https://sf.net/tracker/?func=detail&aid=1532111&group_id=23067&atid=377408
  577.     //$typeAr[MYSQLI_TYPE_CHAR]        = 'string';
  578.     $typeAr[MYSQLI_TYPE_GEOMETRY]    = 'unknown';
  579.  
  580.     $fields = mysqli_fetch_fields($result);
  581.  
  582.     // this happens sometimes (seen under MySQL 4.0.25)
  583.     if (!is_array($fields)) {
  584.         return false;
  585.     }
  586.  
  587.     foreach ($fields as $k => $field) {
  588.         $fields[$k]->_type = $field->type;
  589.         $fields[$k]->type = $typeAr[$field->type];
  590.         $fields[$k]->_flags = $field->flags;
  591.         $fields[$k]->flags = PMA_DBI_field_flags($result, $k);
  592.  
  593.         // Enhance the field objects for mysql-extension compatibilty
  594.         //$flags = explode(' ', $fields[$k]->flags);
  595.         //array_unshift($flags, 'dummy');
  596.         $fields[$k]->multiple_key
  597.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_MULTIPLE_KEY_FLAG);
  598.         $fields[$k]->primary_key
  599.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_PRI_KEY_FLAG);
  600.         $fields[$k]->unique_key
  601.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_UNIQUE_KEY_FLAG);
  602.         $fields[$k]->not_null
  603.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_NOT_NULL_FLAG);
  604.         $fields[$k]->unsigned
  605.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_UNSIGNED_FLAG);
  606.         $fields[$k]->zerofill
  607.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_ZEROFILL_FLAG);
  608.         $fields[$k]->numeric
  609.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_NUM_FLAG);
  610.         $fields[$k]->blob
  611.             = (int) (bool) ($fields[$k]->_flags & MYSQLI_BLOB_FLAG);
  612.     }
  613.     return $fields;
  614. }
  615.  
  616. /**
  617.  * return number of fields in given $result
  618.  *
  619.  * @param   object mysqli result    $result
  620.  * @return  integer                 field count
  621.  */
  622. function PMA_DBI_num_fields($result)
  623. {
  624.     return mysqli_num_fields($result);
  625. }
  626.  
  627. /**
  628.  * returns the length of the given field $i in $result
  629.  *
  630.  * @uses    mysqli_fetch_field_direct()
  631.  * @param   object mysqli result    $result
  632.  * @param   integer                 $i      field
  633.  * @return  integer                 length of field
  634.  */
  635. function PMA_DBI_field_len($result, $i)
  636. {
  637.     $info = mysqli_fetch_field_direct($result, $i);
  638.     // stdClass::$length will be integrated in
  639.     // mysqli-ext when mysql4.1 has been released.
  640.     return @$info->length;
  641. }
  642.  
  643. /**
  644.  * returns name of $i. field in $result
  645.  *
  646.  * @uses    mysqli_fetch_field_direct()
  647.  * @param   object mysqli result    $result
  648.  * @param   integer                 $i      field
  649.  * @return  string                  name of $i. field in $result
  650.  */
  651. function PMA_DBI_field_name($result, $i)
  652. {
  653.     $info = mysqli_fetch_field_direct($result, $i);
  654.     return $info->name;
  655. }
  656.  
  657. /**
  658.  * returns concatenated string of human readable field flags
  659.  *
  660.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  661.  * @uses    MYSQLI_NUM_FLAG
  662.  * @uses    MYSQLI_PART_KEY_FLAG
  663.  * @uses    MYSQLI_TYPE_SET
  664.  * @uses    MYSQLI_TIMESTAMP_FLAG
  665.  * @uses    MYSQLI_AUTO_INCREMENT_FLAG
  666.  * @uses    MYSQLI_TYPE_ENUM
  667.  * @uses    MYSQLI_BINARY_FLAG
  668.  * @uses    MYSQLI_ZEROFILL_FLAG
  669.  * @uses    MYSQLI_UNSIGNED_FLAG
  670.  * @uses    MYSQLI_BLOB_FLAG
  671.  * @uses    MYSQLI_MULTIPLE_KEY_FLAG
  672.  * @uses    MYSQLI_UNIQUE_KEY_FLAG
  673.  * @uses    MYSQLI_PRI_KEY_FLAG
  674.  * @uses    MYSQLI_NOT_NULL_FLAG
  675.  * @uses    mysqli_fetch_field_direct()
  676.  * @uses    PMA_convert_display_charset()
  677.  * @param   object mysqli result    $result
  678.  * @param   integer                 $i      field
  679.  * @return  string                  field flags
  680.  */
  681. function PMA_DBI_field_flags($result, $i)
  682. {
  683.     $f = mysqli_fetch_field_direct($result, $i);
  684.     $f = $f->flags;
  685.     $flags = '';
  686.     if ($f & MYSQLI_UNIQUE_KEY_FLAG)     { $flags .= 'unique ';}
  687.     if ($f & MYSQLI_NUM_FLAG)            { $flags .= 'num ';}
  688.     if ($f & MYSQLI_PART_KEY_FLAG)       { $flags .= 'part_key ';}
  689.     if ($f & MYSQLI_TYPE_SET)            { $flags .= 'set ';}
  690.     if ($f & MYSQLI_TIMESTAMP_FLAG)      { $flags .= 'timestamp ';}
  691.     if ($f & MYSQLI_AUTO_INCREMENT_FLAG) { $flags .= 'auto_increment ';}
  692.     if ($f & MYSQLI_TYPE_ENUM)           { $flags .= 'enum ';}
  693.     // @TODO seems to be outdated
  694.     if ($f & MYSQLI_BINARY_FLAG)         { $flags .= 'binary ';}
  695.     if ($f & MYSQLI_ZEROFILL_FLAG)       { $flags .= 'zerofill ';}
  696.     if ($f & MYSQLI_UNSIGNED_FLAG)       { $flags .= 'unsigned ';}
  697.     if ($f & MYSQLI_BLOB_FLAG)           { $flags .= 'blob ';}
  698.     if ($f & MYSQLI_MULTIPLE_KEY_FLAG)   { $flags .= 'multiple_key ';}
  699.     if ($f & MYSQLI_UNIQUE_KEY_FLAG)     { $flags .= 'unique_key ';}
  700.     if ($f & MYSQLI_PRI_KEY_FLAG)        { $flags .= 'primary_key ';}
  701.     if ($f & MYSQLI_NOT_NULL_FLAG)       { $flags .= 'not_null ';}
  702.     return PMA_convert_display_charset(trim($flags));
  703. }
  704.  
  705. ?>
  706.